import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.io.IOException;
import javax.swing.*;
import com.generationjava.io.WritingException;

public class Editor extends JPanel implements ActionListener, ListSelectionListener, FocusListener {
	private static final long serialVersionUID = 1L;
	JScrollPane kyssad_kerimisriba, toimetaja_kerimisriba;
	JList kyssadelist;
	JLabel teema_label, failinimi_label;
	JTextArea kyssatekst, teema, failinimi;
	JTextArea[] vassatekst;
	JCheckBox[] tsekbox;
	JPanel[] vastuserida;
	JPanel alumine_panel, all_labelite_pnl, nuppude_panel, toimetaja_panel, juurpaneel, kysimuse_panel;
	JButton salvesta, kustuta_kyssa, lisa_kyssa, lisa_vastus, kustuta_vastus;
	JFileChooser fc;
	Kysimused kysimuste_database;
	String fail;
	int kyssaindeks = 0, vassaindeks;
 
	public Editor(Kysimused kyssad, String fail) {
		kysimuste_database = kyssad;
		this.fail = fail;
		this.setLayout(new BorderLayout());
		this.setOpaque(true);
		if(kysimuste_database.get_Kysimused().size() > 0) displayEditor();
		fc = new JFileChooser();
	}

	public int indeksikontroll() {
		if (kysimuste_database.get_Kysimused().size()<= kyssaindeks) {
			kyssaindeks = kysimuste_database.get_Kysimused().size() - 1;
		}
		if (kysimuste_database.get_Kysimused().size()== 0) {
			Kysimus uus = new Kysimus();
			kysimuste_database.add_kysimus(uus);
			kyssaindeks = 0;
		}
		return kyssaindeks;
	}

	public void vastuste_suuruse_kontroll() {
		if (kysimuste_database.get_Kysimused().get(kyssaindeks).getHowManyAnswers() == 0) {
			kysimuste_database.get_Kysimused().get(kyssaindeks).add_vastus(new Vastus());
		}
	}

	public void kysimusteList() {
		kyssaindeks = indeksikontroll();
		String[] kyssad = new String[kysimuste_database.get_Kysimused().size()];
		for (int i=0; i<kysimuste_database.get_Kysimused().size(); i++) { // TODO JList laius
			if(kysimuste_database.get_Kysimused().get(i).get_kysimus().length() > 15)
				kyssad[i]= i+1 + " " + kysimuste_database.get_Kysimused().get(i).get_kysimus().substring(0,15);
			else kyssad[i]= i+1 + " " + kysimuste_database.get_Kysimused().get(i).get_kysimus();
		}
		if (kyssad_kerimisriba != null) kyssad_kerimisriba.removeAll();
		kyssadelist = new JList(kyssad);
		kyssadelist.setSelectedIndex(kyssaindeks);
	}

	public void displayEditor() {
		if (juurpaneel != null) this.remove(juurpaneel);
		if (toimetaja_panel != null) this.remove(toimetaja_panel);
		if (toimetaja_kerimisriba != null) this.remove(toimetaja_kerimisriba);
		if (kyssad_kerimisriba != null) this.remove(kyssad_kerimisriba);
		
		juurpaneel = new JPanel();
		juurpaneel.setLayout(new BorderLayout());
		this.repaint();
		kysimusteList();
		toimetaja_panel = new JPanel();
		refresh_toimetaja_panel();
		teema_label = new JLabel("TEEMA: ");
		teema = new JTextArea(kysimuste_database.getTeema());
		teema.setFont(new Font("Arial", 1, 13));
		teema.setBorder(BorderFactory.createLineBorder(Color.gray));
		lisa_kyssa = new JButton("Lisa küsimus");
		lisa_vastus = new JButton("Lisa vastus");
		kustuta_vastus = new JButton("Kustuta vastus");
		kustuta_vastus.setEnabled(false);
		kustuta_kyssa = new JButton("Kustuta küsimus");
		salvesta = new JButton("Salvesta fail");
		lisa_kyssa.addActionListener(this);
		lisa_vastus.addActionListener(this);
		kustuta_vastus.addActionListener(this);
		kustuta_kyssa.addActionListener(this);
		salvesta.addActionListener(this);
		failinimi_label = new JLabel("FAIL : ");
		failinimi = new JTextArea(fail);
		failinimi.setFont(new Font("Arial", 1, 13));
		failinimi.setBorder(BorderFactory.createLineBorder(Color.gray));
		
		alumine_panel = new JPanel();
		alumine_panel.setLayout(new BorderLayout());
		all_labelite_pnl = new JPanel();
		nuppude_panel = new JPanel();
		all_labelite_pnl.add(teema_label);
		all_labelite_pnl.add(teema);
		nuppude_panel.add(lisa_kyssa);
		nuppude_panel.add(lisa_vastus);
		nuppude_panel.add(kustuta_vastus);
		nuppude_panel.add(kustuta_kyssa);
		nuppude_panel.add(salvesta);
		nuppude_panel.add(failinimi_label);
		nuppude_panel.add(failinimi);
		alumine_panel.add(all_labelite_pnl, BorderLayout.WEST);
		alumine_panel.add(nuppude_panel, BorderLayout.EAST);
		kyssadelist.addListSelectionListener(this);
		kyssad_kerimisriba = new JScrollPane(kyssadelist);
		juurpaneel.add(kyssad_kerimisriba, BorderLayout.WEST);
		toimetaja_kerimisriba = new JScrollPane();
		toimetaja_kerimisriba.setViewportView(toimetaja_panel);
		juurpaneel.add(toimetaja_kerimisriba, BorderLayout.CENTER);
		juurpaneel.add(alumine_panel, BorderLayout.SOUTH);
		this.add(juurpaneel);
		// if(kyssaindeks > 18) kyssadelist.ensureIndexIsVisible(kyssaindeks);
	}
	
	public void refresh_toimetaja_panel() {
		if (toimetaja_panel!=null) toimetaja_panel.removeAll();
		// toimetaja_panel = new JPanel();
		vastuste_suuruse_kontroll();
		int vastuseid = kysimuste_database.get_Kysimused().get(kyssaindeks).getHowManyAnswers();
		toimetaja_panel.setLayout(new GridLayout(vastuseid + 1, 1));
		kyssatekst = new JTextArea(3,55);
		kyssatekst.setLineWrap(true);
		kyssatekst.setMargin(new Insets(5,5,5,5));
		kyssatekst.setText(kysimuste_database.get_Kysimused().get(kyssaindeks).get_kysimus());
		kyssatekst.setFont(new Font("Arial", 1, 13));
		kyssatekst.setBorder(BorderFactory.createLineBorder(Color.black));
		kysimuse_panel = new JPanel();
		kysimuse_panel.add(kyssatekst);
		toimetaja_panel.add(kysimuse_panel);
		vastuserida = new JPanel[vastuseid];
		tsekbox = new JCheckBox[vastuseid];
		vassatekst = new JTextArea[vastuseid];
		for (int i=0; i < vastuseid; i++) {
			tsekbox[i] = new JCheckBox();
			tsekbox[i].addActionListener(this);
			vassatekst[i] = new JTextArea(2,58);
			vassatekst[i].setLineWrap(true);
			vassatekst[i].addFocusListener(this);
			vastuserida[i] = new JPanel();
			if (kysimuste_database.get_Kysimused().get(kyssaindeks).get_vastused().get(i).getVastus_kasoige()) {
				vassatekst[i].setBackground(new Color(200, 255, 200));
				tsekbox[i].setSelected(true);
			}
			vassatekst[i].setText(kysimuste_database.get_Kysimused().get(kyssaindeks).get_vastused().get(i).getVastuse_text());
			vassatekst[i].setBorder(BorderFactory.createLineBorder(Color.GRAY));
			vastuserida[i].add(tsekbox[i]);
			vastuserida[i].add(vassatekst[i]);
			toimetaja_panel.add(vastuserida[i]);
		}
		if (kustuta_vastus != null) kustuta_vastus.setEnabled(false);
	} // end refresh_toimetaja_panel()

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "Salvesta fail") {
			kysimuste_database.setTeema(teema.getText());
			fail = failinimi.getText();
			salvestaKysimus();
			int returnVal = fc.showSaveDialog(this);
            if (returnVal == JFileChooser.APPROVE_OPTION) 
            	try {
            		try {
            			kysimuste_database.xmlKirjutaja(kysimuste_database, fc.getSelectedFile().getCanonicalPath(), true);
            		} catch (IOException e1) {
            			e1.printStackTrace();
            		}
            	} catch (WritingException e1) {
            		e1.printStackTrace();
            	}
		}
		if (e.getActionCommand() == "Kustuta küsimus") {
			kyssaindeks = kyssadelist.getSelectedIndex();
			kysimuste_database.get_Kysimused().remove(kyssaindeks);
			displayEditor();
			this.revalidate();
		}
		if (e.getActionCommand() == "Lisa küsimus") {
			salvestaKysimus();
			Kysimus uus = new Kysimus();
			kysimuste_database.add_kysimus(uus);
			kyssaindeks = kysimuste_database.get_Kysimused().size() - 1;
			displayEditor();
			this.revalidate();
		}
		if (e.getActionCommand() == "Lisa vastus") {
			salvestaKysimus();
			kysimuste_database.get_Kysimused().get(kyssaindeks).add_vastus(new Vastus());
			refresh_toimetaja_panel();
			this.revalidate();
		}
		if (e.getActionCommand() == "Kustuta vastus") {
			salvestaKysimus();
			kysimuste_database.get_Kysimused().get(kyssaindeks).remove_vastus(vassaindeks);
			refresh_toimetaja_panel();
			this.revalidate();
		}
		for(int i=0; i < tsekbox.length; i++) {
			if (tsekbox[i].isSelected()) 
				kysimuste_database.get_Kysimused().get(kyssaindeks).get_vastused().get(i).setVastus_kasoige(true);
			else kysimuste_database.get_Kysimused().get(kyssaindeks).get_vastused().get(i).setVastus_kasoige(false);
		}
		salvestaKysimus();
		refresh_toimetaja_panel();
		this.revalidate();
	}

	public void valueChanged(ListSelectionEvent arg0) {
		kysimuste_database.setTeema(teema.getText());
		fail = failinimi.getText();
		salvestaKysimus();
		kyssaindeks = kyssadelist.getSelectedIndex();
		refresh_toimetaja_panel();
		this.revalidate();
	}

	public void salvestaKysimus() {
		kysimuste_database.get_Kysimused().get(kyssaindeks).set_kysimus(kyssatekst.getText());
		for(int i=0; i < vassatekst.length; i++) 
			kysimuste_database.get_Kysimused().get(kyssaindeks).get_vastused().get(i).setVastuse_text(vassatekst[i].getText());
	}

	@Override
	public void focusGained(FocusEvent arg0) {
		kustuta_vastus.setEnabled(true);
		for(int i=0; i < vassatekst.length; i++) 
			if(vassatekst[i].isFocusOwner()) {
				vassaindeks = i;
			}
	}
	@Override
	public void focusLost(FocusEvent arg0) {
	}
}
